package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

import javax.naming.NamingException;
import javax.servlet.*;
import javax.servlet.http.*;

import entities.*;

import negocio.BusinessDelegate;

public class TallerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public TallerServlet() {
		super();
	}
	
	private BusinessDelegate businessDelegate;

	public void setBusinessDelegate(BusinessDelegate businessDelegate) {
		this.businessDelegate = businessDelegate;
	}

	public BusinessDelegate getBusinessDelegate() {
		return businessDelegate;
	}

	public void init(ServletConfig conf) throws ServletException {
		super.init(conf);

		try {
			setBusinessDelegate(new BusinessDelegate());
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String url="/Menu.jsp";
	    ServletContext sc = getServletContext();
	    RequestDispatcher rd = sc.getRequestDispatcher(url);
	    rd.forward(request,response);
	}

	protected void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		HttpSession session = req.getSession();
		session.setAttribute("businessDelegate", getBusinessDelegate());

		String action = req.getParameter("action");
		
		//COTIZAR
		if (action.equals("COTIZAR")) {
			session.setAttribute("solicitudCotizacion",
					new SolicitudCotizacion());
			ir("/Cotizar.jsp", req, res);
		} else if (action.equals("AGREGARITEMCOTIZACION")) {
			SolicitudCotizacion solicitudCotizacion = (SolicitudCotizacion) session
					.getAttribute("solicitudCotizacion");
			String codigo = req.getParameter("codigo");
			
			if ((buscarItemACotizar(solicitudCotizacion, codigo) == null)
				&&(buscarArticulo(codigo) != null))
			{
				ItemACotizar item = new ItemACotizar();
				item.setCodigo(codigo);
				item.setCantidad(1);
				item.setSolicitudCotizacion(solicitudCotizacion);
				solicitudCotizacion.getItemsACotizar().add(item);
				session.setAttribute("solicitudCotizacion", solicitudCotizacion);
			}
			ir("/Cotizar.jsp", req, res);
		} else if (action.equals("INCREMENTARITEMCOTIZACION")) {
			SolicitudCotizacion solicitudCotizacion = (SolicitudCotizacion) session
					.getAttribute("solicitudCotizacion");
			String codigo = req.getParameter("codigoSeleccionado");
			ItemACotizar item = buscarItemACotizar(solicitudCotizacion, codigo);
			item.setCantidad(item.getCantidad() + 1);
			session.setAttribute("solicitudCotizacion", solicitudCotizacion);
			ir("/Cotizar.jsp", req, res);
		} else if (action.equals("DECREMENTARITEMCOTIZACION")) {
			SolicitudCotizacion solicitudCotizacion = (SolicitudCotizacion) session
				.getAttribute("solicitudCotizacion");
			String codigo = req.getParameter("codigoSeleccionado");
			ItemACotizar item = buscarItemACotizar(solicitudCotizacion, codigo);
			item.setCantidad(item.getCantidad() - 1);
			if (item.getCantidad() == 0){
				solicitudCotizacion.getItemsACotizar().remove(item);
			}
			session.setAttribute("solicitudCotizacion", solicitudCotizacion);
			ir("/Cotizar.jsp", req, res);
		} else if (action.equals("TERMINARCOTIZACION")) {
			SolicitudCotizacion solicitudCotizacion = (SolicitudCotizacion) session
				.getAttribute("solicitudCotizacion");
			Cotizacion cotizacion = getBusinessDelegate().cotizar(solicitudCotizacion);
			session.setAttribute("cotizacion", cotizacion);
			ir("/MostrarCotizacion.jsp", req, res);
		} 
		
		
		//COMPRAR
		else if (action.equals("COMPRAR")) {
			session.setAttribute("solicitudCompra",
					new SolicitudCompra());
			ir("/Comprar.jsp", req, res);
		} else if(action.equals("AGREGARITEMCOMPRAR"))
		{			
			SolicitudCompra solicitudCompra = (SolicitudCompra) session.getAttribute("solicitudCompra");
			String codigo = req.getParameter("codigo");
			
			if((buscarItemAComprar(solicitudCompra, codigo)== null) && buscarArticulo(codigo)!= null)
			{
				ItemAComprar item = new ItemAComprar();
				item.setCodigo(codigo);
				item.setCantidad(1);
				item.setSolicitudCompra(solicitudCompra);
				Cotizacion cotizacion = getBusinessDelegate().obtenerUltimaCotizacion(codigo);
				if (cotizacion != null){
					ItemCotizado itemCotizado = buscarItemCotizado(cotizacion, codigo);
					if (itemCotizado != null){
						item.setPrecioUltimaCotizacion(itemCotizado.getPrecio());
						item.setFechaUltimaCotizacion(cotizacion.getVigencia());
					}
				}
				
				solicitudCompra.getItemsAComprar().add(item);
				session.setAttribute("solicitudCompra", solicitudCompra);
			}
			ir("/Comprar.jsp", req, res);
				
		}else if (action.equals("INCREMENTARITEMCOMPRAR")) {
			SolicitudCompra solicitudCompra = (SolicitudCompra) session
			.getAttribute("solicitudCompra");
			String codigo = req.getParameter("codigoSeleccionado");
			ItemAComprar item = buscarItemAComprar(solicitudCompra, codigo);
			item.setCantidad(item.getCantidad() + 1);
			session.setAttribute("solicitudCompra", solicitudCompra);
			ir("/Comprar.jsp", req, res);
		} else if (action.equals("DECREMENTARITEMCOMPRAR")) {
			SolicitudCompra solicitudCompra = (SolicitudCompra) session
			.getAttribute("solicitudCompra");
			String codigo = req.getParameter("codigoSeleccionado");
			ItemAComprar item = buscarItemAComprar(solicitudCompra, codigo);
			item.setCantidad(item.getCantidad() - 1);
			if (item.getCantidad() == 0){
				solicitudCompra.getItemsAComprar().remove(item);
			}
			session.setAttribute("solicitudCompra", solicitudCompra);
			ir("/Comprar.jsp", req, res);
		} else if (action.equals("TERMINARCOMPRA")) {
			SolicitudCompra solicitudCompra = (SolicitudCompra) session
			.getAttribute("solicitudCompra");
			getBusinessDelegate().solicitarCompra(solicitudCompra);
		
			ir("/MostrarCompra.jsp", req, res);
		} 
		
		//Listado Productos
		else if (action.equals("LISTARPROD")) {
			ir("/ListarProductos.jsp", req, res);
		} else if (action.equals("MENU")) {
			ir("/Menu.jsp", req, res);
		}
	}

	private ItemCotizado buscarItemCotizado(Cotizacion cotizacion, String codigo) {
		
		Iterator<ItemCotizado> itr = cotizacion.getItemsCotizados().iterator();
		while (itr.hasNext()) {
			ItemCotizado item = itr.next();
			if (item.getCodigo().equalsIgnoreCase(codigo)) {
				return item;
			}
		}
		return null;
	}

	private ItemAComprar buscarItemAComprar(SolicitudCompra solicitudCompra,
			String codigo) {		
		
		Iterator<ItemAComprar> itr = solicitudCompra.getItemsAComprar().iterator();
		while (itr.hasNext()) {
			ItemAComprar item = itr.next();
			if (item.getCodigo().equalsIgnoreCase(codigo)) {
				return item;
			}
		}
		
		return null;
		
	}

	private Producto buscarArticulo(String codigo) {
		
		ArrayList<Producto> articulos = getBusinessDelegate().obtenerArticulos();
		
		Iterator<Producto> itrArt = articulos.iterator();
		while (itrArt.hasNext()) {
			Producto p = itrArt.next();
			if (p.getCodigo().equalsIgnoreCase(codigo)) {
				return p;
			}
		}
	
		return null;
	}
	
	private ItemACotizar buscarItemACotizar(SolicitudCotizacion solicitudCotizacion, String codigo) {

		Iterator<ItemACotizar> itr = solicitudCotizacion.getItemsACotizar().iterator();
		while (itr.hasNext()) {
			ItemACotizar item = itr.next();
			if (item.getCodigo().equalsIgnoreCase(codigo)) {
				return item;
			}
		}
		
		return null;
	}
	
	private void ir(String url, HttpServletRequest req, HttpServletResponse res) {
		ServletContext sc = getServletContext();
		RequestDispatcher rd = sc.getRequestDispatcher(url);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
